package client;

import events.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*; 

import utils.Alarmas;
import utils.Sensores;
import events.Event;
import sensores.*;


public class Client {
	
	public static String seleccion = "";
	
	public static void main(String args[]) throws IOException{
		
		Client cl = new Client();
		cl.interfazConsola();
	}
	
	public void interfazConsola() throws IOException{
		BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
		int opcion, opcionP, agua=0, luz=0, temp=0;
		do{
			//Menu.menuPrincipal();
			 //Cambio para probar
			Menu.menuProducto();
			opcion = Integer.parseInt(stdin.readLine());
			switch(opcion)
			{
				case 1:
					//Menu.menuProducto();
					//opcion = Integer.parseInt(stdin.readLine());
					Menu.descriptinP1();
					Client cl1 = new Client();
					cl1.activarInvernadero(cl1.producto1());
				break;
				
				case 2:
					//Menu.menuProductoPersonalizado();
					Menu.descriptinP2();
					Client cl2 = new Client();
					cl2.activarInvernadero(cl2.producto2());
				break;

				case 3:
					Menu.descriptinP3();
					Client cl3 = new Client();
					cl3.activarInvernadero(cl3.producto3());
				break;
				
				case 4:
					Menu.menuProductoPersonalizado();
					Client cl4 = new Client();
					cl4.activarInvernadero(cl4.producto4());
				break;
				
				case 5:
					System.out.println("\nHasta pronto!");
					System.exit(0);
				break;
				default: System.out.println("No ha escrito ninguna opcion valida.");
			}
			System.out.print("Pulse s si desea continuar o cualquier tecla para salir: ");
			seleccion = stdin.readLine();
		}while (seleccion.equals("s"));
		
	}
	
	
	public void activarInvernadero(ManageEvents tareas){
		for(int i = 0;i < tareas.getSize();i++){
			Event currentEvent = tareas.getNext();
			//aplicar el corte cuando active el evento para activar su sensor
			currentEvent.accion();//aqui aplicar los 2 cortes
			//aplicar el corte de monitorizar el sensor solo cuando sea un evento de tipo revisar y regreso un valor false
			//si es false se activa la alarma
		}
	}
	
	public ManageEvents producto1(){
		ManageEvents listaEventos = new ManageEvents();
		
		ActivarSensorTemperatura iniciarSTemperatura = new ActivarSensorTemperatura();
		//iniciarSTemperatura.setDispositivo("Sensor"+Sensores.TEMPERATURA);
		SensorTemperatura st = new SensorTemperatura();
		st.setAlarmas("Alarma"+Alarmas.EMAIL);
		st.setAlarmas("Alarma"+Alarmas.LUZ);
		st.setAlarmas("Alarma"+Alarmas.SMS);
		st.setAlarmas("Alarma"+Alarmas.SONORA);
		st.setAlarmas("Alarma"+Alarmas.VOZ);
		iniciarSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(iniciarSTemperatura);

		ActivarSensorLuz iniciarSLuz = new ActivarSensorLuz();
		SensorLuz sl = new SensorLuz();
		sl.setAlarmas("Alarma"+Alarmas.EMAIL);
		sl.setAlarmas("Alarma"+Alarmas.LUZ);
		sl.setAlarmas("Alarma"+Alarmas.SMS);
		sl.setAlarmas("Alarma"+Alarmas.SONORA);
		sl.setAlarmas("Alarma"+Alarmas.VOZ);
		iniciarSLuz.getManageSensores().addSensor(sl);
		listaEventos.addEvent(iniciarSLuz);

		ActivarSensorHumedad iniciarSHumedad = new ActivarSensorHumedad();
		SensorHumedad sh = new SensorHumedad();
		sh.setAlarmas("Alarma"+Alarmas.EMAIL);
		sh.setAlarmas("Alarma"+Alarmas.LUZ);
		sh.setAlarmas("Alarma"+Alarmas.SMS);
		sh.setAlarmas("Alarma"+Alarmas.SONORA);
		sh.setAlarmas("Alarma"+Alarmas.VOZ);
		iniciarSHumedad.getManageSensores().addSensor(sh);
		listaEventos.addEvent(iniciarSHumedad);
		
		ActivarSensorRiego iniciarSRiego = new ActivarSensorRiego();
		SensorRiego sr = new SensorRiego();
		sr.setAlarmas("Alarma"+Alarmas.EMAIL);
		sr.setAlarmas("Alarma"+Alarmas.LUZ);
		sr.setAlarmas("Alarma"+Alarmas.SMS);
		sr.setAlarmas("Alarma"+Alarmas.SONORA);
		sr.setAlarmas("Alarma"+Alarmas.VOZ);
		iniciarSRiego.getManageSensores().addSensor(sr);
		listaEventos.addEvent(iniciarSRiego);
		
		ActivarSensorVentilacion iniciarSVentilacion = new ActivarSensorVentilacion();
		SensorViento sv = new SensorViento();
		sv.setAlarmas("Alarma"+Alarmas.EMAIL);
		sv.setAlarmas("Alarma"+Alarmas.LUZ);
		sv.setAlarmas("Alarma"+Alarmas.SMS);
		sv.setAlarmas("Alarma"+Alarmas.SONORA);
		sv.setAlarmas("Alarma"+Alarmas.VOZ);
		iniciarSVentilacion.getManageSensores().addSensor(sv);
		listaEventos.addEvent(iniciarSVentilacion);
		
		
		RevisarSensorHumedad revisarShumedad = new RevisarSensorHumedad();
		revisarShumedad.getManageSensores().addSensor(sh);
		listaEventos.addEvent(revisarShumedad);
		listaEventos.addEvent(revisarShumedad);
		listaEventos.addEvent(revisarShumedad);
		
		RevisarSensorLuz revisarSLuz = new RevisarSensorLuz();
		revisarSLuz.getManageSensores().addSensor(sl);
		listaEventos.addEvent(revisarSLuz);
		listaEventos.addEvent(revisarSLuz);
		listaEventos.addEvent(revisarSLuz);
		
		RevisarSensorTemperatura revisarSTemperatura = new RevisarSensorTemperatura();
		revisarSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(revisarSTemperatura);
		listaEventos.addEvent(revisarSTemperatura);
		listaEventos.addEvent(revisarSTemperatura);
		
		RevisarSensorRiego revisarSRiego = new RevisarSensorRiego();
		revisarSRiego.getManageSensores().addSensor(sr);
		listaEventos.addEvent(revisarSRiego);
		listaEventos.addEvent(revisarSRiego);
		listaEventos.addEvent(revisarSRiego);

		RevisarSensorVentilacion revisarSVentilacion = new RevisarSensorVentilacion();
		revisarSVentilacion.getManageSensores().addSensor(sv);
		listaEventos.addEvent(revisarSVentilacion);
		listaEventos.addEvent(revisarSVentilacion);
		listaEventos.addEvent(revisarSVentilacion);
		
		DetenerSensorTemperatura detenerSTemperatura = new DetenerSensorTemperatura();
		detenerSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(detenerSTemperatura);
		
		DetenerSensorHumedad detenerSHumedad = new DetenerSensorHumedad();
		detenerSHumedad.getManageSensores().addSensor(sh);
		listaEventos.addEvent(detenerSHumedad);

		DetenerSensorLuz detenerSLuz = new DetenerSensorLuz();
		detenerSLuz.getManageSensores().addSensor(sl);
		listaEventos.addEvent(detenerSLuz);

		DetenerSensorRiego detenerSRiego = new DetenerSensorRiego();
		detenerSRiego.getManageSensores().addSensor(sr);
		listaEventos.addEvent(detenerSRiego);

		DetenerSensorVentilacion detenerSVentilacion = new DetenerSensorVentilacion();
		detenerSVentilacion.getManageSensores().addSensor(sv);
		listaEventos.addEvent(detenerSVentilacion);
		
		listaEventos.addEvent(iniciarSTemperatura);
		listaEventos.addEvent(iniciarSLuz);
		listaEventos.addEvent(iniciarSHumedad);
		listaEventos.addEvent(iniciarSRiego);
		listaEventos.addEvent(iniciarSVentilacion);
		
		listaEventos.addEvent(revisarShumedad);
		listaEventos.addEvent(revisarShumedad);
		listaEventos.addEvent(revisarShumedad);
		
		listaEventos.addEvent(revisarSLuz);
		listaEventos.addEvent(revisarSLuz);
		listaEventos.addEvent(revisarSLuz);
		
		listaEventos.addEvent(revisarSTemperatura);
		listaEventos.addEvent(revisarSTemperatura);
		listaEventos.addEvent(revisarSTemperatura);
		
		listaEventos.addEvent(revisarSRiego);
		listaEventos.addEvent(revisarSRiego);
		listaEventos.addEvent(revisarSRiego);
		
		listaEventos.addEvent(revisarSVentilacion);
		listaEventos.addEvent(revisarSVentilacion);
		listaEventos.addEvent(revisarSVentilacion);
		
		listaEventos.addEvent(detenerSTemperatura);
		listaEventos.addEvent(detenerSHumedad);
		listaEventos.addEvent(detenerSLuz);
		listaEventos.addEvent(detenerSRiego);
		listaEventos.addEvent(detenerSVentilacion);
		
		//Client invernadero = new Client();
		//invernadero.activarInvernadero(listaEventos);
		return listaEventos;
	}
	
	public ManageEvents producto2(){
		ManageEvents listaEventos = new ManageEvents();
		
		ActivarSensorTemperatura iniciarSTemperatura = new ActivarSensorTemperatura();
		//iniciarSTemperatura.setDispositivo("Sensor"+Sensores.TEMPERATURA);
		SensorTemperatura st = new SensorTemperatura();
		st.setAlarmas("Alarma"+Alarmas.EMAIL);
		st.setAlarmas("Alarma"+Alarmas.LUZ);
		st.setAlarmas("Alarma"+Alarmas.SONORA);
		iniciarSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(iniciarSTemperatura);

		ActivarSensorHumedad iniciarSHumedad = new ActivarSensorHumedad();
		SensorHumedad sh = new SensorHumedad();
		sh.setAlarmas("Alarma"+Alarmas.EMAIL);
		sh.setAlarmas("Alarma"+Alarmas.LUZ);
		sh.setAlarmas("Alarma"+Alarmas.SONORA);
		iniciarSHumedad.getManageSensores().addSensor(sh);
		listaEventos.addEvent(iniciarSHumedad);
		
		ActivarSensorRiego iniciarSRiego = new ActivarSensorRiego();
		SensorRiego sr = new SensorRiego();
		sr.setAlarmas("Alarma"+Alarmas.EMAIL);
		sr.setAlarmas("Alarma"+Alarmas.LUZ);
		sr.setAlarmas("Alarma"+Alarmas.SONORA);
		iniciarSRiego.getManageSensores().addSensor(sr);
		listaEventos.addEvent(iniciarSRiego);
		
		RevisarSensorHumedad revisarShumedad = new RevisarSensorHumedad();
		revisarShumedad.getManageSensores().addSensor(sh);
		listaEventos.addEvent(revisarShumedad);
		
		RevisarSensorTemperatura revisarSTemperatura = new RevisarSensorTemperatura();
		revisarSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(revisarSTemperatura);
		
		RevisarSensorRiego revisarSRiego = new RevisarSensorRiego();
		revisarSRiego.getManageSensores().addSensor(sr);
		listaEventos.addEvent(revisarSRiego);

		DetenerSensorTemperatura detenerSTemperatura = new DetenerSensorTemperatura();
		detenerSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(detenerSTemperatura);
		
		DetenerSensorHumedad detenerSHumedad = new DetenerSensorHumedad();
		detenerSHumedad.getManageSensores().addSensor(sh);
		listaEventos.addEvent(detenerSHumedad);

		DetenerSensorRiego detenerSRiego = new DetenerSensorRiego();
		detenerSRiego.getManageSensores().addSensor(sr);
		listaEventos.addEvent(detenerSRiego);
		
		listaEventos.addEvent(iniciarSTemperatura);
		listaEventos.addEvent(iniciarSHumedad);
		listaEventos.addEvent(iniciarSRiego);
		
		listaEventos.addEvent(revisarShumedad);
		listaEventos.addEvent(revisarSTemperatura);
		listaEventos.addEvent(revisarSRiego);
		
		listaEventos.addEvent(detenerSTemperatura);
		listaEventos.addEvent(detenerSHumedad);
		listaEventos.addEvent(detenerSRiego);
		
		return listaEventos;
	}
	
	
	
	public ManageEvents producto3(){
		ManageEvents listaEventos = new ManageEvents();
		
		ActivarSensorTemperatura iniciarSTemperatura = new ActivarSensorTemperatura();
		//iniciarSTemperatura.setDispositivo("Sensor"+Sensores.TEMPERATURA);
		SensorTemperatura st = new SensorTemperatura();
		st.setAlarmas("Alarma"+Alarmas.LUZ);
		st.setAlarmas("Alarma"+Alarmas.SONORA);
		iniciarSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(iniciarSTemperatura);
		
		RevisarSensorTemperatura revisarSTemperatura = new RevisarSensorTemperatura();
		revisarSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(revisarSTemperatura);
		
		DetenerSensorTemperatura detenerSTemperatura = new DetenerSensorTemperatura();
		detenerSTemperatura.getManageSensores().addSensor(st);
		listaEventos.addEvent(detenerSTemperatura);
				
		listaEventos.addEvent(iniciarSTemperatura);
		
		listaEventos.addEvent(revisarSTemperatura);
		
		listaEventos.addEvent(detenerSTemperatura);
		
		return listaEventos;
	}
	
	
	public ManageEvents producto4()throws NullPointerException{
		Menu mn = new Menu();
		ManageEvents listaEventos = new ManageEvents();
		SensorHumedad[] sh = new SensorHumedad[mn.agua];
		SensorLuz[] sl = new SensorLuz[mn.luz];
		SensorTemperatura[] st = new SensorTemperatura[mn.temp];
		boolean band=true;
		
			for(int i=0; i<mn.agua; i++){
				ActivarSensorHumedad iniciarsHumedad = new ActivarSensorHumedad();
				sh[i] = new SensorHumedad();
				sh[i].setAlarmas("Alarma"+Alarmas.LUZ);
				//sh[i].setAlarmas("Alarmas"+Alarmas.SONORA);
				listaEventos.addEvent(iniciarsHumedad);
			}
		
		
			for(int k=0; k<mn.luz; k++){
				ActivarSensorLuz iniciarsLuz = new ActivarSensorLuz();
				sl[k] = new SensorLuz();
				sl[k].setAlarmas("Alarma"+Alarmas.LUZ);
				//sl[k].setAlarmas("Alarmas"+Alarmas.SONORA);
				listaEventos.addEvent(iniciarsLuz);
			}
			
			for(int j=0; j<mn.temp; j++){
				ActivarSensorTemperatura iniciarsTemperatura = new ActivarSensorTemperatura();
				
				st[j]=new SensorTemperatura();
				st[j].setAlarmas("Alarma"+Alarmas.LUZ);
				//st[j].setAlarmas("Alarmas"+Alarmas.SONORA);
				listaEventos.addEvent(iniciarsTemperatura);
			}
			
			try{
			
				
			
			for(int i=0; i<sh.length; i++){
				
				RevisarSensorHumedad revisarSHumedad = new RevisarSensorHumedad();
				revisarSHumedad.getManageSensores().addSensor(sh[i]);
				listaEventos.addEvent(revisarSHumedad);
			}

			for(int k=0; k<sl.length; k++){
				
				RevisarSensorLuz revisarSLuz = new RevisarSensorLuz();
				revisarSLuz.getManageSensores().addSensor(sl[k]);
				listaEventos.addEvent(revisarSLuz);
			}
			
			for(int j=0; j<st.length; j++){
				
				RevisarSensorTemperatura revisarSTemperatura = new RevisarSensorTemperatura();
				revisarSTemperatura.getManageSensores().addSensor(st[j]);
				listaEventos.addEvent(revisarSTemperatura);
			}
			
			for(int i=0; i<sh.length; i++){
				DetenerSensorHumedad detenerSHumedad = new DetenerSensorHumedad();
				detenerSHumedad.getManageSensores().addSensor(sh[i]);
				listaEventos.addEvent(detenerSHumedad);
			}
			
			for(int k=0; k<sl.length; k++){
				DetenerSensorLuz detenerSLuz = new DetenerSensorLuz();
				detenerSLuz.getManageSensores().addSensor(sl[k]);
				listaEventos.addEvent(detenerSLuz);
			}
			
			for(int j=0; j<st.length; j++){
				DetenerSensorTemperatura detenerSTemperatura = new DetenerSensorTemperatura();
				detenerSTemperatura.getManageSensores().addSensor(st[j]);
				listaEventos.addEvent(detenerSTemperatura);
			}
			
			
		}
			catch(NullPointerException ex){
				
			}
		
		return listaEventos;
	}
}
